# 定义数组
add = ['{', '[']                    # 表示需要增加 换行符 的字符
rem = ['}', ']']                    # 表示需要减少 换行符 的字符    
br = [';', ',']                     # 该数组表示需要 换行 的字符
kill = [' ', '\n', '\t', '\r']      # 该数组表示需要 清洗 的字符

def tab(num):                       # tab 函数 专门用于返回指定数量的 tab键
    tb = ''                         # python 不支持 None 文本相加 所以要定义一个 ''
    for i in range(num):            # 有多少 tab 循环多少遍
        tb = tb + '\t'
    return tb                       # 返回 tab文本 信息

def text_clear(str):                # 文本清洗
    text = ''                       # 同理
    for i in str:                   # 遍历本文
        if i in kill:               # 如果该文本存在于 kill 数组 则本次操作放弃
            pass
        else:                       # 未存在于该数组 将文本加入待输出
            text = text + i
    return text                     # 返回清洗后数据

def json(str):                      # json 清洗本体
    str = text_clear(str)           # 先将进入本函数的文本进行清洗
    tab_number = 0                  # 默认初始 tab 为0
    text = ''                       # 默认初始 文本 为空
    for i in range(len(str)):       # 遍历本文
        if str[i] in add and str[i + 1] not in rem:         # 如果文本存在于 增加换行符 数组
            tab_number += 1                                 # tab键 +1
            text = text + str[i] + '\r\n' + tab(tab_number) # 执行 换行符 or 缩进
        elif str[i] in rem and str[i - 1] not in add:       # 如果文本存在于 减少换行符 数组
            tab_number -= 1                                 # tab键 -1
            text = text + '\r\n' + tab(tab_number) + str[i] # 执行 换行符 or 缩进
        elif str[i] in br:                                  # 如果文本存在与 换行 数组
            text = text + str[i] + '\r\n' + tab(tab_number) # 执行    换行
        else:                                               # 文本不存在上述数组 直接添加文本
            text = text + str[i]
    return text                                             # 返回文本数据
